14.21 Flexibles Java-Look & Feel 

Das Aussehen der Komponenten lässt sich frei bestimmen und erzeugt so bei jedem Benutzer auf seiner Architektur die Illusion, es wäre eine plattformabhängige Applikation. Das Programm gliedert sich hinsichtlich des Aussehens in die anderen Programme ein und fällt nicht als Fremdling auf. Standardmäßig begegnet uns das Look & Feel (L&F) mit dem Namen »Ocean« (früher war es »Metal«).
Um das Aussehen von Java-Applikationen zu ändern, gibt es eine Reihe von Möglichkeiten:
- Beim Programmstart einen Schalter setzen
- Eine Konfigurationsdatei in das lib-Verzeichnis setzen
- Im Java-Programm von Hand das L&F verändern
14.21.1 L&F global setzten 

Um für alle Java-Programme zentral ein L&F zu setzen, wird in das C:\Program-me\Java\jdk1.6.0\jre\lib-Verzeichnis eine kleine Datei swing.properties gesetzt:
Listing 14.61 swing.properties
swing.defaultlaf=com.sun.java.swing.plaf.windows.WindowsLookAndFeel
Der Schalter swing.defaultlaf bestimmt die Klasse für das L&F; in unserem Fall Windows. Automatisch nehmen alle gestarteten Java-Programme dieses Standard-L & F an – es sei denn, sie setzen es wieder im Programm um. Das zeigen die folgenden Abschnitte.
14.21.2 UIManager 

Das L&F von Applikationen lässt sich zur Laufzeit ändern. Dazu müssen wir nur eine statische Methode der Klasse UIManager aufrufen, die sich um das Aussehen der Programme kümmert. Hier ist es die spezielle Methode setLookAndFeel(), die als Argument einen Klassennamen erwartet. Verschiedene Methoden sind deklariert, mit denen wir das Java-eigene L&F und das System-L&F einstellen können. Da Benutzer von Java-Programmen im Allgemeinen eine Systemoberfläche erwarten, sollten wir das Java-L&F nach dem Erzeugen des Fensters umschalten.
|
public class javax.swing.UIManager implements Serializable |
- static LookAndFeel getLookAndFeel() Gibt das aktuelle L&F zurück.
- static String getSystemLookAndFeelClassName() Gibt das L&F des aktuellen Fenstersystems zurück.
- static String getCrossPlatformLookAndFeelClassName() Liefert den Namen der Klassen für das systemunabhängige L&F.
- static void setLookAndFeel( String className ) throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException Setzt ein neues L&F.
| Beispiel Der folgende Programmblock setzt mit setLookAndFeel() das Aussehen einer Oberfläche, wie es das System vorgibt. Die Programme sollten dann wie native Programme aussehen.
Listing 14.62 com/javatutor/insel/ui/swing/SetLookAndFeel.java, Ausschnit |
Einige spezielle L&F sind nicht auf jeder Architektur erlaubt. So verbietet Apple sein eigenes L&F auf Plattformen anderer Hersteller. [Apple betrachtete die Windows-Version 2.1 als Look-And-Feel-Clone und verklagte Microsoft ab 1988 wegen Urheberrechtsverletzungen auf eine Summe von über fünf Milliarden US-Dollar. Letztendlich bekam Apple aber nichts; das Verfahren wurde 1997 eingestellt. 1989 klagte Xerox gegen Apple und beanspruchte das Urheberrecht an grafischen Oberflächen für sich. ] Dennoch lässt sich das Aqua-L&F installieren, in den Pfad integrieren und dann als com.apple.mrj.swing.MacLookAndFeel einbinden. Weitere Infos dazu bietet die Webseite http://www.ing.unitn.it/~luttero/javaonMac/.
Ändern des Aussehens zur Laufzeit
Das Setzen eines L & Fs mit setLookAndFeel() führt zu keinem Neuzeichnen der Komponenten. Wird das neue L & F gesetzt, bevor Swing die Komponenten darstellen muss, fällt das nicht auf. Mit dargestellten Komponenten müssen wir jedoch das Neuzeichnen anstoßen. Dazu dient die Methode:
SwingUtilities.updateComponentTreeUI( component );
Die component wird im Allgemeinen das Window (also JFrame/JWindow) sein.
Ein Problem ergibt sich, wenn der Frame noch Window-Objekte erzeugt, da diese immer Kinder eines Fensters sind; Änderungen des Aussehens müssen an diese Kinder weitergegeben werden. Dazu erfragen wir zuerst alle Fenster über die statische Funktion Frame.get-Frames().Anschließend laufen wir vom Fenster alle Windows ab, die wir dann aktualisieren.
for ( Frame f : Frame.getFrames() ) { SwingUtilities.updateComponentTreeUI( f ); for ( Window w : f.getOwnedWindows() ) SwingUtilities.updateComponentTreeUI( w ); }
14.21.3 Verbessern des Aussehens unter Windows mit JGoodies Looks 

Zwar bemühte sich Sun bis Java 6 bestmöglich das Windows XP-Look & Feel zu emulieren, doch an allen Stellen gelingt das nicht. Seit Java 6 nutzt das System den nativen Windows-Renderer, so dass Unstimmigkeiten eigentlich ausgeschlossen sein sollten. Verbesserungen lassen sich auch nicht so einfach publizieren, da Sun an Release-Zyklen gebunden ist. In diesem Fall hilft JGoodies Looks (https://slooks.dev.java.net/), ein Look and Feel unter der BSD-Lizenz. Das Ziel von Looks ist die perfekte Nachbildung des Aussehens für die Windows-Reihen 95/98/NT/ME/2000/2003/XP/Vista ab Java 1.4. Gegenüber dem Windows Look and Feel von Sun korrigiert es viele Feinheiten, wie passende Insets bei Eingabefeldern, Icons, Farben, Rahmen, den richtigen Font, Menüeigenschaften, Auflösungen von 96 und 120 dpi und vieles mehr.
Gesetzt wird Looks wie jedes andere Look & Feel:
try { String laf = LookUtils.IS_OS_WINDOWS_XP ? Options.getCrossPlatformLookAndFeelClassName() : Options.getSystemLookAndFeelClassName(); UIManager.setLookAndFeel( laf ); } catch ( Exception e ) { System.err.println( "Can't set look & feel:" + e ); }
14.21.4 Swing-Beschriftungen eine andere Sprache geben 

Die Swing-Komponenten sind von Haus aus lokalisiert. So begegnet dem Anwender ein Dateiauswahldialog unter dem deutschen System auch mit deutschen Beschriftungen. Die Sprache lässt sie über das passende Locale-Objekt ändern. So setzt für neue Komponenten folgendes die Sprache auf Arabisch:
JComponent.setDefaultLocale( new Locale("ar") );
Mit der Änderung auf eine Sprache, die von rechts nach links schreibt, ist automatisch eine Umsortierung der Komponenten verbunden, wenn diese zum Beispiel in einem Container mit FlowLayout liegen.
Ändern der Zeichenfolgen
Die Zeichenketten selbst werden aus einer Ressourcen-Datei gelesen und sind im UIManager present.
| Beispiel Um die deutsche Beschriftung »Suchen in:« im Dateiauswahldialog zu ersetzen, ist die Eigenschaft FileChooser.lookInLabelText zu setzen:
Listing 14.63 com/javatutor/insel/ui/swing/LocalizeSwingChooser.java, main() UIManager.put( "FileChooser.lookInLabelText" ,"Worin'e suchen tust:" ); new JFileChooser().showOpenDialog( null ); System.exit( 0 ); |
Eine Liste aller zu setzenden Properties ist etwa auf der Webseite http://www.rgagnon.com/javadetails/JavaUIDefaults.txt aufgelistet.
Um für alle Programme die Änderungen gültig zu machen, sollten für das verwendete Look and Feel .properties-Dateien angelegt werden. Die Dateien müssen dann im Programmpfad stehen. So sehen die Dateipfade für Windows und Metal folgendermaßen aus:
- javax/swing/plaf/metal/resources/metal_de.properties
Die Dateien sind die bekannten Ressourcen-Dateien mit den Schlüsseln, die in Java-UIDefaults.txt genannt sind.
Beispiel Um unter dem Windows-Look and Feel global einen Bezeichner für den Dateiauswahldialog zu ändern, setzen wir in windows_de.properties:
FileChooser.lookInLabelText=Worin'e suchen tust: |



